package fr.uniscol.dao.impl;

import fr.uniscol.dao.IGroupeDao;
import fr.uniscol.dao.UniscolDaoSupport;

import static fr.uniscol.dao.impl.SQLNames.*;
import fr.uniscol.dao.mapper.ClasseRowMapper;
import fr.uniscol.model.BaseAnneeScolaire;
import fr.uniscol.model.Groupe;
import fr.uniscol.dao.mapper.GroupeRowMapper;
import fr.uniscol.model.Classe;
import java.sql.SQLException;
import java.util.List;
import org.springframework.stereotype.Repository;

@Repository("groupeDao")
public class GroupeDaoImpl extends UniscolDaoSupport implements IGroupeDao {

	@Override
	public Groupe getGroupeById(long groupeId){
        
        Groupe groupe = getJdbcTemplate().queryForObject("SELECT * FROM " + TABLE_STRUCTURE + " WHERE structureid=?", new Object[]{
            groupeId
        }, new GroupeRowMapper());
        
        return groupe;
	}
	
	@Override
	public boolean saveGroupe(Groupe groupe) {
		
		if(groupe.getBase() == null){
			throw new NullPointerException("Le groupe n'est pas associé à une base");
		}
		
		String req = "";
		Object[] params = null;
		int rowsAffected = 0;
		
		if(groupe.getId() == 0){
			
			if(!groupe.getCodeStructure().equals("")){
				// Synchro
				req = "UPDATE uni_groupe SET libelle=? WHERE etablissementid=? AND annee=? AND code_structure=? ";
				params = new Object[]{
					groupe.getLibelle(),
					groupe.getBase().getEtablissement().getId(),
					groupe.getBase().getAnnee(),
					groupe.getCodeStructure()
				};
				
				rowsAffected = getJdbcTemplate().update(req, params);
			}

			if(rowsAffected == 0){
				// Ajout
				req = "INSERT INTO uni_groupe(etablissementid, annee, libelle, code_structure) VALUES(?,?,?,?)";
				params = new Object[]{
						groupe.getBase().getEtablissement().getId(),
						groupe.getBase().getAnnee(),
						groupe.getLibelle(),
						groupe.getCodeStructure()
				};
				
				rowsAffected = getJdbcTemplate().update(req, params);
			}
			
		}else{
			// Maj
			req = "UPDATE uni_groupe SET libelle=? WHERE etablissementid=? AND annee=? AND groupeid=? ";
			params = new Object[]{
					groupe.getBase().getEtablissement().getId(),
					groupe.getBase().getAnnee(),
					groupe.getId()
			};
			
			rowsAffected = getJdbcTemplate().update(req, params);
		}
		return rowsAffected == 1;
	}

    @Override
    public List<Groupe> getAllGroupesOfEtablissement(BaseAnneeScolaire base) {
        
        List<Groupe> groupes = getJdbcTemplate().query("SELECT * FROM " + TABLE_STRUCTURE + " WHERE baseid=? AND type_structure='GP'", new Object[]{
            base.getId()
        }, new GroupeRowMapper());
        
        return groupes;
    }

    @Override
    public List<Classe> getStructuresAppartenance(Groupe groupe) {
        
        List<Classe> structures = getJdbcTemplate().query("SELECT c.* FROM " + TABLE_STRUCTURE_GROUPE + " g, " + TABLE_STRUCTURE + " c WHERE g.groupeid=? AND c.structureid=g.classeid ",
            new Object[]{
                groupe.getId()
            }, new ClasseRowMapper());
        
        return structures;
    }
}
